package com.example.leetcode.day;

import java.util.*;

/**
 * 给定一个单词列表 words 和一个整数 k ，返回前 k 个出现次数最多的单词。
 *
 * 返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率， 按字典顺序 排序。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/top-k-frequent-words
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Day692 {

    public List<String> topKFrequent(String[] words, int k) {
        Map<String,Integer> map = new HashMap<>();
        for (String s :words) {
            map.put(s,map.getOrDefault(s,0) + 1);
        }
        PriorityQueue<String> priorityQueue = new PriorityQueue<>((x,y) ->{
            Integer integer = map.get(x);
            Integer integer1 = map.get(y);
            if (Objects.equals(integer,integer1)) {
                return x.compareTo(y);
            }
            if (integer > integer1) {
                return -1;
            }
            return 1;
        });
        for (Map.Entry<String,Integer> entry : map.entrySet()) {
            priorityQueue.add(entry.getKey());
        }
        List<String> list = new ArrayList<>();
        while (k > 0) {
            list.add(priorityQueue.poll());
            k--;
        }
        return list;
    }

    public static void main(String[] args) {
        Day692 d = new Day692();
        String[] words ={"i","love","leetcode","i","love","code"};
        int k =2;
        System.out.println(d.topKFrequent(words, k));
    }
}
